/**
 * Dexie数据库定义
 *
 * 定义IndexedDB数据库结构和版本管理
 */

import Dexie, { Table } from 'dexie'
import {
  StoredDocument,
  DocumentVersion,
  StoredStoryboard,
  StoredAsset,
  StoredConfig
} from './types'

/**
 * AppDatabase - 应用数据库类
 *
 * 使用Dexie定义IndexedDB数据库结构
 */
export class AppDatabase extends Dexie {
  // 表定义
  documents!: Table<StoredDocument, string>
  versions!: Table<DocumentVersion, string>
  storyboards!: Table<StoredStoryboard, string>
  assets!: Table<StoredAsset, string>
  config!: Table<StoredConfig, string>

  constructor() {
    super('rongmei-zhichuang')

    // Version 1: 初始版本
    this.version(1).stores({
      // documents表
      // 索引: id(主键), type, status, _searchTitle, _updatedAtTimestamp
      // 复合索引: [type+_updatedAtTimestamp] 用于按类型和时间查询
      documents: 'id, type, status, _searchTitle, _updatedAtTimestamp, [type+_updatedAtTimestamp]',

      // versions表
      // 索引: id(主键), documentId, createdAt
      // 复合索引: [documentId+createdAt] 用于查询文档版本时间线
      versions: 'id, documentId, createdAt, [documentId+createdAt]',

      // storyboards表 (预留给未来扩展,当前不使用)
      // 索引: id(主键), title, createdAt, updatedAt
      storyboards: 'id, title, createdAt, updatedAt',

      // assets表
      // 索引: id(主键), type, name, createdAt
      assets: 'id, type, name, createdAt',

      // config表
      // 索引: key(主键)
      config: 'key'
    })

    // Version 2: 未来扩展预留
    // this.version(2).stores({
    //   // 可在此添加新表或修改索引
    // }).upgrade(tx => {
    //   // 数据迁移逻辑
    // })
  }
}

/**
 * 数据库实例
 * 单例模式,全局共享
 */
export const db = new AppDatabase()

/**
 * 数据库初始化
 * 检查数据库是否可用
 */
export async function initializeDatabase(): Promise<boolean> {
  try {
    // 尝试打开数据库
    await db.open()
    console.log('[IndexedDB] 数据库初始化成功')
    console.log('[IndexedDB] 数据库名称:', db.name)
    console.log('[IndexedDB] 数据库版本:', db.verno)
    return true
  } catch (error) {
    console.error('[IndexedDB] 数据库初始化失败', error)
    return false
  }
}

/**
 * 清空数据库
 * 仅用于测试或重置
 */
export async function clearDatabase(): Promise<void> {
  try {
    await db.documents.clear()
    await db.versions.clear()
    await db.storyboards.clear()
    await db.assets.clear()
    await db.config.clear()
    console.log('[IndexedDB] 数据库已清空')
  } catch (error) {
    console.error('[IndexedDB] 清空数据库失败', error)
    throw error
  }
}

/**
 * 删除数据库
 * 仅用于完全重置
 */
export async function deleteDatabase(): Promise<void> {
  try {
    await db.delete()
    console.log('[IndexedDB] 数据库已删除')
  } catch (error) {
    console.error('[IndexedDB] 删除数据库失败', error)
    throw error
  }
}

/**
 * 获取数据库统计信息
 */
export async function getDatabaseStats(): Promise<{
  documentsCount: number
  versionsCount: number
  storybsoardsCount: number
  assetsCount: number
  configCount: number
}> {
  try {
    const [documentsCount, versionsCount, storyboardsCount, assetsCount, configCount] =
      await Promise.all([
        db.documents.count(),
        db.versions.count(),
        db.storyboards.count(),
        db.assets.count(),
        db.config.count()
      ])

    return {
      documentsCount,
      versionsCount,
      storybsoardsCount: storyboardsCount,
      assetsCount,
      configCount
    }
  } catch (error) {
    console.error('[IndexedDB] 获取统计信息失败', error)
    throw error
  }
}
